package com.jiyun.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.jiyun.pojo.goods.Goods;
import com.jiyun.pojo.goods.Sku;
import com.jiyun.pojo.goods.Spu;
import com.jiyun.service.goods.CategoryService;
import com.jiyun.service.goods.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
@RequestMapping("item")
public class ItemController {


    @Reference
    SpuService spuService;

    @Value("${pagePath}") // 获取配置文件中的内容
    private String pagePath;

    @Autowired // 模板引擎
    private TemplateEngine templateEngine;

    @Reference
    CategoryService categoryService;


    // 去数据库查，要用RestController  不对
    // 是否需要访问页面

    // 生成静态页面，需要访问页面？

    @RequestMapping("createPage")
    public void createPage(Long id) throws FileNotFoundException, UnsupportedEncodingException {

        // 所有的url都准备好


        // 1.查询数据
        Goods goods = spuService.findGoodsById(id);

        Spu spu = goods.getSpu();

        List<String> categoryNames = new ArrayList<>();

        categoryNames.add(categoryService.findById(spu.getCategory1Id()).getName());
        categoryNames.add(categoryService.findById(spu.getCategory2Id()).getName());
        categoryNames.add(categoryService.findById(spu.getCategory3Id()).getName());

        List<Sku> skuList = goods.getSkuList();

        Map urlMap = new HashMap();
        for (Sku sku : skuList) {
            if("1".equals(sku.getStatus())) {
                String specJson = JSON.toJSONString(JSON.parseObject(sku.getSpec()),
                        SerializerFeature.MapSortField);
//            String s = sku.getSpec();
                urlMap.put(specJson, sku.getId() + ".html");
            }
        }

        // 每个SKU一个数据html
        for (Sku sku : skuList) {
            // 2.准备数据
            Context context = new Context();
            Map map = new HashMap();
            // 获取sku和spu的信息
            map.put("spu", spu);
            map.put("sku", sku);

            // 获取分类名称
            map.put("categoryNames",categoryNames);
            // 获取sku和spu的图片
            map.put("skuImages",sku.getImages().split(","));
            map.put("spuImages",spu.getImages().split(","));
            
            // 获取规格参数
            Map paraItems = JSON.parseObject(spu.getParaItems());
            map.put("paraItems",paraItems);
            Map specItems = JSON.parseObject(sku.getSpec());
            map.put("specItems",specItems);



            // 获取当前SPU的所有规格信息
            Map specMap = JSON.parseObject(spu.getSpecItems());
            // {"规格":["88片","80片","104片","96片"]}
            // {"规格":[{value:"88片",checked:true},"80片","104片","96片"]}
            // {"规格":[{value:"88片",checked:true , url: },"80片","104片","96片"]}


            // 循环所有的spu的值
            for (Object o : specMap.keySet()) {
                // 得到所有的spu的值
                List list = (List)specMap.get(o.toString());
                List list2 = new ArrayList();
                for (Object o1 : list) {
                    Map m = new HashMap();
                    m.put("value",o1.toString());
                    // 给每一个按钮，都添加一个url，url的内容，和sku的属性绑定

                    Map spec= JSON.parseObject(sku.getSpec());//当前SKU规格
                    spec.put(o.toString(),o1.toString());
                    String specJson=JSON.toJSONString( spec, SerializerFeature.MapSortField);

                    m.put("url",urlMap.get(specJson));

                    // 拿spu的每个值和当前的sku的值进行比较
                    for (Object o2 : specItems.keySet()) {
                        String s = specItems.get(o2.toString()).toString();
                        // 得到sku的值，和spu的某一个值进行比较
                        if (s.equals(o1.toString())) {
                            m.put("checked", true);
                            // 将当前循环打断，彻底不运行了
                            break;
                        } else {
                            m.put("checked", false);
                        }

                    }
                    list2.add(m);
                }
                specMap.put(o,list2);
            }

            map.put("specMap",specMap);
            // 存放数据的地方
            context.setVariables(map);

            // 3.找到文件的位置
            File file = new File(pagePath + sku.getId() + ".html");

            // 只要是IO流，必须抛出异常
            Writer writer = new PrintWriter(file, "UTF-8");

            // 4.将模板和数据绑定到一起，生成新的页面

            // 1.模板文件的名称   2.上下文菜单，用来携带数据  3.输出流

            templateEngine.process("item", context, writer);
        }


    }

}
